
#include <linux/module.h>	
#include <linux/init.h>			
                           
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/string.h>
#include <linux/bcd.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/semaphore.h>
#include <linux/miscdevice.h>
#include <linux/io.h>
#include <linux/uaccess.h>
#include <linux/delay.h>

/****
10.编写i2c_driver程序框架模版        自己写的
 * 
 */  


static int ft5x06_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
      
      printk("this is  my_ft5x06_probe ");
      return 0; 
};

static int ft5x06_remove(struct i2c_client *client)
{
    // printk("this is  ft5x06_remove ");
    return 0;
};

static struct of_device_id ft5x06_dt_ids[] = {
    { .compatible = "my-ft5x06" },
    { }
};


// 定义 i2c_device_id 结构体数组,用于标识 ft5x06 设备
static const struct i2c_device_id ft5x06_id[] = {
    { "my-ft5x06", 0 },
    { }
};



/***
 * name 和 id_table: 使用i2c_client匹配
 * of_match_table : 在使用设备树的时候使用的匹配规则 
 */ 
static struct i2c_driver ft5x06_driver = {
    .probe      = ft5x06_probe,
    .remove     = ft5x06_remove,
    .id_table   = ft5x06_id,
    .driver = {
        .name     = "my_ft5x06",
        .owner    = THIS_MODULE,
	    .of_match_table = of_match_ptr(ft5x06_dt_ids),
    },
};



static int ft5x06_driver_init(void)
{
    int ret; 

    ret = i2c_add_driver(&ft5x06_driver);


    if(ret < 0 ){
         printk("ft5x06_driver_init  fail");
         return ret; 
    }

    return 0; 
};



static void ft5x06_driver_exit(void)
{

    printk("this is  ft5x06_driver_exit ");
    i2c_del_driver(&ft5x06_driver);
};

//late_initcall(goodix_ts_init);
module_init(ft5x06_driver_init);

module_exit(ft5x06_driver_exit);

MODULE_DESCRIPTION("GTP Series Driver");
MODULE_LICENSE("GPL");
